iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0

本文介紹 Projucer 建立的 GUI Application 框架基本架構。框架(Framework)可以想像成「骨幹」,Projucer 搭了視窗應用程式的骨幹,再由開發者視需求加上必要的表皮以及邏輯。

回顧上次建立的 GUI App,不改動任何程式碼,直接編譯執行的樣子:

底下簡述構成上述視窗的程式碼。

首先,Projucer 會產生 Main.cpp,內含自 GUI Application 的主要類別(JUCEApplication)。其中,我們的程式主類別名為 SamGUIApplicationApplication,其名稱由建立專案時,於 Projucer 輸入的 Projec Name 組合而成,該類別繼承自 juce::JUCEApplication。這個設計是 JUCE GUI Application 的核心架構,程式要能順利運作,背後涉及許多模組合作。要說明其中關係需要不少篇幅,以後再說...

底下截錄 SamGUIApplicationApplication 程式碼片段,為了版面,稍做調整。拿掉自動產生的註解,看起來更加樸實無華:

class SamGUIApplicationApplication  : public juce::JUCEApplication
{
public:
  SamGUIApplicationApplication() {}

  const juce::String getApplicationName() override
  {
    return ProjectInfo::projectName;
  }
  
  const juce::String getApplicationVersion() override
  {
    return ProjectInfo::versionString;
  }
  
  bool moreThanOneInstanceAllowed() override { return true; }

  void initialise (const juce::String& commandLine) override
  {
      mainWindow.reset (new MainWindow (getApplicationName()));
  }

  void shutdown() override
  {
      mainWindow = nullptr; // (deletes our window)
  }
};

START_JUCE_APPLICATION (SamGUIApplicationApplication)

要理解應用程式框架,必須理解其生命周期——開始執行的進入點,結束時如何離開。JUCE GUI Application 執行時,會先建立 juce::JUCEApplication,所以會先建立 SamGUIApplicationApplication 物件,執行 Constructor。

接著呼叫 initialise 函數,其中 commandLine 字串代表執行時的輸入參數;結束時,shutdown 會被呼叫。

透過上述規則,發者可於 initialise 函數內放入初始化的程式碼或確保相依模組已經就續。

同樣地,JUCE 程式完全關閉前,會呼叫 shutdown 函數,此時可做清理、釋放記憶體、儲存未存的檔案等...。這兩個函數皆可被繼承,但我通常不這麼做。

接著看兩個重要函數:

void systemRequestedQuit() override
{
    quit();
}

void anotherInstanceStarted (const juce::String& commandLine) override
{
}

systemRequestedQuit 為一 Callback 函數,被呼叫時,表示程式即將結束。預設呼叫 quit(),其內部觸發相關事件後,程式中止。quit() 內部實作如下:

void JUCEApplicationBase::quit()
{
    MessageManager::getInstance()->stopDispatchLoop();
}

接下來我將一一拆解 JUCE GUI Application 的主要元素...


上一篇
Day 5:建立專案(三):專案檔案架構
下一篇
Day 7:持續拆解主類別
系列文
JUCE 入門 @ 跨平台應用程式開發使用 C++29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言